package com.common.frame.utils

import java.math.BigInteger
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException

object MD5Util {

    /**
     * 加密公共方法
     * @Title: toMD5
     * @param str
     * @return String 返回值
     */
    fun toMD5(str: String?): String? {
        return if (str == null || "" == str) {
            null
        } else bytesToHexString(getDigest(str.toByteArray()))
    }

    /**
     * 转16进制字符
     * @param data
     * @return String 返回值
     */
    fun bytesToHexString(data: ByteArray?): String? {
        if (data == null) {
            return null
        }
        val sb = StringBuffer()
        for (i in data.indices) {
            val t = data[i].toInt()
            sb.append(Integer.toString(t shr 4 and 0xF, 16)).append(Integer.toString(t and 0xF, 16))
        }
        val ret = sb.toString()
        return ret.toLowerCase()
    }

    /**
     *
     * md5加密
     * @param data
     * @return byte[] 返回值
     */
    fun getDigest(data: ByteArray): ByteArray? {
        var dgt: ByteArray? = null
        var md: MessageDigest? = null
        try {
            md = MessageDigest.getInstance("MD5")
        } catch (e: NoSuchAlgorithmException) {
        }
        md?.reset()
        md?.update(data)
        dgt = md?.digest()
        return dgt
    }

    /**
     * MD5加密字符串32位小写
     * @param str
     * @return
     */
    fun getMD5(str: String): String? {
        return try {
            // 生成一个MD5加密计算摘要
            val md = MessageDigest.getInstance("MD5")
            // 计算md5函数
            md.update(str.toByteArray())
            // digest()最后确定返回md5 hash值，返回值为8为字符串。因为md5 hash值是16位的hex值，实际上就是8位的字符
            // BigInteger函数则将8位的字符串转换成16位hex值，用字符串来表示；得到字符串形式的hash值
            val md5 = BigInteger(1, md.digest()).toString(16)
            //BigInteger会把0省略掉，需补全至32位
            fillMD5(md5)
        } catch (e: Exception) {
            throw RuntimeException("MD5加密错误:" + e.message, e)
        }
    }

    private fun fillMD5(md5: String): String? {
        return if (md5.length == 32) md5 else fillMD5("0$md5")
    }


}